//
//  SlapperController.h
//  My Dream Slapper
//
//  Created by Jason Harris on 8/22/06.
//  Copyright (c) 2006, Jason Harris and Geekspiff
//  All rights reserved.
//  
//  Redistribution and use in source and binary forms, with or without modification, are permitted provided
//  that the following conditions are met:
//  
//  Redistributions of source code must retain the above copyright notice, this list of conditions and the
//  following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list
//  of conditions and the following disclaimer in the documentation and/or other materials provided with the
//  distribution. Neither the name of Jason Harris, Geekspiff, nor the names of its contributors may be used
//  to endorse or promote products derived from this software without specific prior written permission.
//  
//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
//  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
//  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
//  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
//  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
//  POSSIBILITY OF SUCH DAMAGE.
//

#import <Cocoa/Cocoa.h>
@class MyManagedObjectContext;


typedef enum
{
	kSlapperNormalStatus, 
	kSlapperErrorStatus, 
} SlapperStatus;


@interface SlapperController : NSWindowController {
	MyManagedObjectContext *_managedObjectContext;
	NSPersistentStoreCoordinator *_persistentStoreCoordinator;
	MCPConnection *_connection;
	NSString *_password;
	NSString *_connectionError;
	NSNumber *_isConnecting;
	NSString *_status;
	NSColor *_statusColor;
	NSTimer *_synchronizeTimer;
	NSData *_newComment;
	NSArray *_folderSortDescriptors;
	NSArray *_sortDescriptors, *_commentsSortDescriptors;
	NSString *_newFolderName;
	NSTimeZone *_dbTimezone;
	
	IBOutlet NSPanel *_connectionSheet;
	IBOutlet NSProgressIndicator *_connectionProgressSpinner;
	IBOutlet NSPanel *_commentSheet;
	IBOutlet NSArrayController *_foldersController;
	IBOutlet NSArrayController *_submissionsController;
	IBOutlet NSObjectController *_commentController;
	IBOutlet NSTableView *_foldersTableView;
	IBOutlet NSTableView *_submissionsTableView;
	IBOutlet NSPanel *_newFolderSheet;
	IBOutlet NSTextField *_newFolderPrompt;
}

	// Connection
- (void)initConnection;
- (void)setupAutoSyncing;
- (IBAction)createConnection: (id)sender;
- (NSString *)username;
- (BOOL)login;
- (void)presentConnectionSheet;
- (IBAction)connectionLoginPressed: (NSButton *)sender;
- (IBAction)connectionCancelPressed: (NSButton *)sender;

	// Synchronizing
- (IBAction)synchronize: (NSTimer *)timer;
- (void)loggedInSynchronize;
- (void)performSynchronizationActions;
- (void)stopSynchronizing;

	// CoreData
- (void)initCoreData;
- (void)initMetadataStore;
- (void)configureNewStore;
- (void)saveCoreDataStore;
- (MyManagedObjectContext *)managedObjectContext;
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator;
- (void)syncSQLUsers;
- (void)syncSQLUsersWithRows: (MCPResult *)rows;
- (void)createSQLUserFromDictionary: (NSDictionary *)srcDict;
- (void)updateSQLUser: (id)entity fromDictionary: (NSDictionary *)srcDict;
- (void)syncSharedFolders;
- (void)syncSharedFoldersWithRows: (MCPResult *)rows;
- (void)createSharedFolderFromDictionary: (NSDictionary *)srcDict;
- (void)updateSharedFolder: (id)entity fromDictionary: (NSDictionary *)srcDict;
- (void)syncContestEntries;
- (void)syncContestEntriesWithRows: (MCPResult *)rows;
- (void)populateContestEntry: (id)entity fromDictionary: (NSDictionary *)srcDict;
- (void)syncEntryComments;
- (void)syncEntryCommentsWithRows: (MCPResult *)rows;
- (void)populateEntryComments: (id)entity fromDictionary: (NSDictionary *)srcDict;
- (void)syncRatings;
- (void)syncRatingsWithRows: (MCPResult *)rows;
- (void)createRatingFromDictionary: (NSDictionary *)srcDict sqlUser: (NSManagedObject *)sqlUser contestEntry: (NSManagedObject *)contestEntry;
- (void)updateRating: (id)entity fromDictionary: (NSDictionary *)srcDict sqlUser: (NSManagedObject *)sqlUser contestEntry: (NSManagedObject *)contestEntry;
- (void)syncSharedFolderSubmissions;
- (void)syncSharedFolderSubmissionsWithRows: (MCPResult *)rows;

	// Uploading
- (void)uploadDirtyObjects;
- (void)uploadRating: (NSManagedObject *)ratingContainer;
- (void)uploadEntryComment: (NSManagedObject *)comment;
- (void)uploadSharedFolder: (NSManagedObject *)sharedFolder;
- (void)uploadSharedFolderStructure: (NSManagedObject *)sharedFolderContainer;
- (void)uploadSharedFolderContents: (NSManagedObject *)sharedFolderContainer;

	// Comments
- (IBAction)addComment: (id)sender;
- (IBAction)commitComment: (NSButton *)sender;
- (IBAction)cancelComment: (NSButton *)sender;
- (void)createComment;

	// Folders
- (IBAction)newFolder: (id)sender;
- (IBAction)newSharedFolder: (id)sender;
- (IBAction)createFolderPressed: (NSButton *)sender;
- (IBAction)cancelCreateFolderPressed: (NSButton *)sender;
- (BOOL)isFolderNameValid;

	// Status
- (IBAction)markAsRead: (id)sender;
- (IBAction)markAsUnread: (id)sender;

	// Misc
- (void)setStatus: (NSString *)status kind: (SlapperStatus)statusKind;
- (void)createSortDescriptorsFromPrefs;
- (void)saveSortDescriptorsToPrefs;

@end
